
 // http 请求
  let http = cc.Class({
      properties:{
          ip:"",
          port:"",
      },
      initConf(ip,port){
          if(!ip || !port)
            return ;
          this.ip = ip;
          this.port = port;
      },
      sendReq(url,data,cb,method = "GET"){
          let http = cc.loader.getXMLHttpRequest();
          http.timeout = 30000;
          let isTimeOut = false;

          //超时abort
          let id = setTimeout(()=>{
              isTimeOut = true;
              http.abort();
          },30000);
          let tempData = "";
          for(let key in data)
          {
            if(tempData != "")
            {
                tempData += "&";
            }
            tempData += key + "=" + data[key];
          }
          let fullUrl = ""
          if(method == "GET")
          {
              //get请求，要发送的数据在请求的url里面，对应到服务端就是在req.query里面
              // 因为浏览器对url有长度限制 ，所以get请求有会对数据长度有限制。
              // get请求不安全，请求参数都会被看到
             fullUrl =  "http://"+  this.ip + ":" + this.port + url + "?" + tempData;
             cc.log(fullUrl);
             //get
            // http.setRequestHeader("Content-type:text/plain;charset=utf8")
             http.open(method,fullUrl,true)
             http.send();
          }
          else if(method == "POST")
          {
              //post 请求，要发送的数据在body里面，在服务器端也是在req.body里面
              // post 
              fullUrl =  "http://"+  this.ip + ":" + this.port + url ;
              cc.log(fullUrl);
             
           
              http.open(method,fullUrl,true)
               //post 请求要设置特定格式的header 设置header一定要在open之后
               //方法的第一个参数 header 大小写不敏感，即可以写成content-type，也可以写成Content-Type，甚至写成content-Type;
                //setRequestHeader必须在open()方法之后，send()方法之前调用，否则会抛错；
              //setRequestHeader可以调用多次，最终的值不会采用覆盖override的方式，而是采用追加append的
              http.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
              http.send(tempData);
          }

          http.onreadystatechange = ()=>{

              if(isTimeOut)
                return ;
                
              clearTimeout(id);
              cc.log(http.readyState);
              // ajxs请求状态范围 1-4
              if(http.readyState == 4)
              {
                  //http 状态码 200,3xx,4xx,5xx 分别代表ok，重定向，客户端有错误，服务端有错误
                  if(http.status == 200)
                  {
                        //反序列化 把一个String转换为一个对象
                        // 反之，序列化就是把一个obj转化为二进制或者String，用来存储或者网络发送。
                        let ret = JSON.parse(http.responseText)
                        cc.log(ret)
                        try {
                            if(cb)
                            {
                                cb(ret)
                            }
                        } catch (error) {
                            cc.log(error.stack);
                        }
                        
                  }
              }
          }
      }
});
module.exports = http;

